--- ksh-openbsd_cvs/c_sh.c	2010-03-27 17:25:30.000000000 +0100
+++ ksh-openbsd_cvs.new/c_sh.c	2010-04-01 21:01:24.132137763 +0200
@@ -837,19 +837,13 @@ c_mknod(char **wp)
 {
 	int argc, optc, ismkfifo = 0, ret;
 	char **argv;
-	void *set = NULL;
-	mode_t mode = 0, oldmode = 0;
+	mode_t mode = 0, old_umask = -1;
 
 	while ((optc = ksh_getopt(wp, &builtin_opt, "m:")) != -1) {
 		switch (optc) {
 		case 'm':
-			set = setmode(builtin_opt.optarg);
-			if (set == NULL) {
-				bi_errorf("invalid file mode");
-				return 1;
-			}
-			mode = getmode(set, DEFFILEMODE);
-			free(set);
+			old_umask = umask(0);
+			mode |= strtoul(builtin_opt.optarg, NULL, 8);
 			break;
 		default:
 			goto usage;
@@ -866,18 +860,17 @@ c_mknod(char **wp)
 	} else if (argc != 4)
 		goto usage;
 
-	if (set)
-		oldmode = umask(0);
-	else
-		mode = DEFFILEMODE;
+	if (old_umask == -1)
+		mode |= DEFFILEMODE;
 
 	if (ismkfifo)
 		ret = domkfifo(argc, argv, mode);
 	else
 		ret = domknod(argc, argv, mode);
 
-	if (set)
-		umask(oldmode);
+	if (old_umask != -1)
+		umask(old_umask);
+
 	return ret;
 usage:
 	builtin_argv0 = NULL;
